From: Oleksandr Dmytryshyn Date: Wed, 27 Nov 2013 17:09:51 +0000 (+0200) Subject: xen: arm: introduce raw_copy_to_guest_flush_dcache() function X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~5839 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=31389a2b12131cef5c9572ebd43b0d21aaf40f15;p=xen.git xen: arm: introduce raw_copy_to_guest_flush_dcache() function This function flushes the dcache while copying the data. Signed-off-by: Oleksandr Dmytryshyn Acked-by: Ian Campbell Acked-by: Julien Grall --- diff --git a/xen/arch/arm/guestcopy.c b/xen/arch/arm/guestcopy.c index d146cd60e4..08800a406a 100644 --- a/xen/arch/arm/guestcopy.c +++ b/xen/arch/arm/guestcopy.c @@ -5,7 +5,8 @@ #include #include -unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len) +static unsigned long raw_copy_to_guest_helper(void *to, const void *from, + unsigned len, unsigned flush_dcache) { /* XXX needs to handle faults */ unsigned offset = (vaddr_t)to & ~PAGE_MASK; @@ -24,6 +25,8 @@ unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len) p = map_domain_page(g>>PAGE_SHIFT); p += offset; memcpy(p, from, size); + if ( flush_dcache ) + flush_xen_dcache_va_range(p, size); unmap_domain_page(p - offset); len -= size; @@ -35,6 +38,17 @@ unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len) return 0; } +unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len) +{ + return raw_copy_to_guest_helper(to, from, len, 0); +} + +unsigned long raw_copy_to_guest_flush_dcache(void *to, const void *from, + unsigned len) +{ + return raw_copy_to_guest_helper(to, from, len, 1); +} + unsigned long raw_clear_guest(void *to, unsigned len) { /* XXX needs to handle faults */ diff --git a/xen/include/asm-arm/guest_access.h b/xen/include/asm-arm/guest_access.h index 8ff088f39a..5876988b23 100644 --- a/xen/include/asm-arm/guest_access.h +++ b/xen/include/asm-arm/guest_access.h @@ -11,6 +11,8 @@ (likely(count < (~0UL/size)) && access_ok(addr,count*size)) unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len); +unsigned long raw_copy_to_guest_flush_dcache(void *to, const void *from, + unsigned len); unsigned long raw_copy_from_guest(void *to, const void *from, unsigned len); unsigned long raw_clear_guest(void *to, unsigned len);